{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n",
" Si c'est votre première visite dans ce TP, lisez attentivement chacun des points détaillé après ce paragraphe.
\n",
" Si vous avez déjà commencer à travailler sur ce TP et que vous souhaiter vous déplacer rapidement dans une partie précise vous pouvez choisir la partie que vous souhaitez rejoindre ci-dessous.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
\n",
" La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
\n",
" Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
\n",
" Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
\n",
" La plateforme propose quelques outils de purge de la mémoire : \n",
"
\n",
" Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S
\n",
" est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.
A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.\n", "
pip install jupyterlab
jupyter notebook
Comme pour le TP1, ne bibliothèque regroupant quelques outils de la cryptologie vous ont été donnée. Chargeons l'intégralité des fonctionnalités qu'elle propose
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from OutilsCrypto import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous êtes invité à travailler sur la première partie du TP1 pour vous refamiliariser avec les fonctionnalités de cette bibliothèque comme codex
, codex
, xedoc
, paquet
, mode2base
, Filtre
ainsi que les fonctions d'attaque par dictionnaire.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Ecrire la fonction PGCD
qui prend en paramètre deux entiers a
et b
et qui renvoie le plus grand diviseur commun à ces deux nombres.
En imitant le développement de l'algorithme vu en cours, écrire la fonction inv_mod
qui prend en paramètre deux entiers a
et n
et renvoie l'inverse de a
modulo n
. On convient que lorsque c'est impossible, la fonciton renvoie $0$
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Ecrire la fonction Eaffine(txt, a, b, paq=1)
qui a trois paramètres obligatoires et un paramètre optionnel:\n",
"
txt
: une chaine de caractèrea
: un entierb
: un entierpaq
: la taille des paquets qui par défaut vaut 1txt
de clef (a, b)
par paquet de paq
. Si paq
vaut 1 alors la fonction devra retourner le décodage des entiers calculer. Sinon la fonction renverra une chaine de caractère correspondant aux entiers chiffrés du message séparé par des $\\texttt{-}$.Ecrire la fonction Daffine(txt, a, b, paq=1)
qui a trois paramètres obligatoires et un paramètre optionnel:\n",
"
txt
: une chaine de caractèrea
: un entierb
: un entierpaq
: la taille des paquets qui par défaut vaut 1txt
de clef (a, b)
par paquet de paq
. paq
vaut 1 alors txt
est une suite de lettre de l'alphabet. Sinon cette chaine est une suite d'entiers séparés par des $\\texttt{-}$. On pourra récupérer une liste de chaine de caractère des entiers par txt.split('-')
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Comme nos l'avons vu avec le chiffrement de César, nous allons nous intérésser ici à une attaque en brute force avec dictionnaire. Exécuter le code suivant pour charger les différents dictionnaires proposée. ATTENTION : Cette opération peux prendre plusieurs secondes (environ 30). Un message de fin s'affichera lorsque le chargement sera terminé.
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"-----> DéBUT DU CHARGMENT DES DICTIONNAIRES <-----\")\n", "top=time.time()\n", "lang=\"FR\"\n", "print(\"CHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tEN COURS\",end='')\n", "DICO_FR = MonDico(lang)\n", "print(\"\\rCHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tTERMINéE (en\", round(time.time()-top, 3), \"secondes)\")\n", "top=time.time()\n", "lang=\"ANG\"\n", "print(\"CHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tEN COURS\",end='')\n", "DICO_ANG = MonDico(lang)\n", "print(\"\\rCHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tTERMINéE (en\", round(time.time()-top, 3), \"secondes)\")\n", "top=time.time()\n", "lang=\"ESP\"\n", "print(\"CHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tEN COURS\",end='')\n", "DICO_ESP = MonDico(lang)\n", "print(\"\\rCHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tTERMINéE (en\", round(time.time()-top, 3), \"secondes)\")\n", "top=time.time()\n", "lang=\"IT\"\n", "print(\"CHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tEN COURS\",end='')\n", "DICO_IT = MonDico(lang)\n", "print(\"\\rCHARGEMENT DU DICTIONNAIRE \\\"\", lang, \"\\\": \\tTERMINéE (en\", round(time.time()-top, 3), \"secondes)\")\n", "print(\"-----> FIN DU CHARGMENT DES DICTIONNAIRES <-----\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ecrire une procédure BruteForcAffine_dico
qui prend en paramètre : \n",
"
txt
: un chaine de caractère correspondant au message à attaquer.paq
: l'entier correspondant à l'hypothétique nombre de paquet utilisé.DICO
: le dictionnaire correspondant à la langue hypothétique du message claire.\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Ecrire une fonction lst_freq
qui prend en paramètre un texte et renvoie un tableau (sous forme de dictionnaire) ou la case 'A' est la fréquence de la lettre A, la case 'B' celle de la lettre B etc...
Ecrire la fonction lettre_plus_freq
qui prend en paramètre un texte et renvoie le caractère le plus fréquent dans ce texte.
Ecrire une fonction attaquefreqaffine_dico
qui prend en paramètre :\n",
"
txt
qui est une chaine de caractère correspondant à un chiffrement affine.paq
qui est un paramètre optionnel correspondant à la taille des paquet utilisé pour ce chiffrement affine.DICO
qui est un paramètre optionnel correspondant à la langue qui aurait été utilisé pour le chiffrement.Dans la case suivante, on réalise un test sur l'attaque fréquentielle mais aussi une comparaison de temps d'éxecution entre l'attaque en force brute et l'attaque fréquentielle. Normalement, une attaque fréquentielle est au moins 10 fois plus rapide qu'une brute force !
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt=\"Pour qu'une attaque fréquentielle soit pertinente, il faut que le message soit relativement long. Voici donc un texte plutôt long qui ne dis rien de franchement intéressant... un peu comme certain politicien. Oui ! Je suis engagé !!!\"\n", "clefa=17\n", "clefb=19\n", "txt0=Filtre(txt).upper()\n", "txt1=Eaffine(txt0, clefa, clefb)\n", "\n", "#Attaque en force brute\n", "BruteForceAffine_dico(txt1)\n", "\n", "#Attaque fréquentielle\n", "attaquefreqaffine_dico(txt1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Attaquer le message suivant qui a été chiffré par la méthode affine. Indiquer à votre enseignant l'auteur du texte claire pour obtenir un petit bonus (ou pas ^_^ )!
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt=\"SPATIYGGSNDAWYPSYZDSMSVNABAPHCPZUSARAWHYZCYGTCYVDAAZTCZYMSGSNWCYPZBNOYASXAZOSNYASXLIDSWAHCSPAHIOZNYPAISVDYABAPHCPZUSARAHIPPCYGHADCZZABNAGUSACGGISBYGISHCYPYDGATYZSPZCBIZAWAPZOIWWAHAUSADUSCSPTNCBBCPZHISOAWAPZTNCBBCPZDCBINZAHAWCOFCWVNACOCAGZUSADUSALYGYZASNCWSNWSNCYRACUSYTNCBBADCBINZAHAWCOFCWVNAOAPCAGZUSAOADCAZNYAPHABDSGCCFHYGZYPOZAWAPZRAWAGISLYAPGUSAOCZCYZHCPGDAMDCOYCDHOAWVNAAZOFCUSAZYGIPVNIHCYZGIPZISNDABDCPOFANHSNATDAZHAGIPCMIPYACNHAWWAPZRAHGYNCYGDAWCZYPAPLCYPWCZCYGRAATTINOHAZYNANHAWAGDYLNAGSPGSNGYGWCZNYGZAGGAWCZNYGZAGGABISNWCDPINABANHSABISNDCBNOYASGAAZNCQIPPCPZATYDDAUSADAGCPMAGPIWWAPZDPINACAZUSCYOYIPPAPIWWANCRCWCYGBDSGAZDAGIQASXZNYGZAAZLCMSAVNSYGGAWAPZHAGNYHACSXBISNBNGWABPZNCYZWANAWBDYGGCYZHAZANNASNGTCPZCGZYUSAGYPOIPPSAGBISNWIYRSGUSCOARISNGYVYAPUSCAPTYPBISNCBCYGANDAVCZZAWAPZHAWIPOCSNRAWAHNAGGCYNBZCPZCOCAGZUSADUSALYGYZASNUSYGIDDYOYZADCAPZNADCBINZAHAWCOFCWVNAUSADUSALYGYZASNCZZCNHGIDDYOYZCPZDCAPZNADCBINZAHAWCOFCWVNACOCAGZOADCWWAAZNYAPHABDSGCWIPWAAPOAWIWAPZGAGAPZYZBDSGTINZAPCFGYZCPZHIPOBCGBDSGDIPMZAWBGCWIPGYASNCHYGRACISWCHCWAAPLNYZRCYWBDINALIZNABCNHIPWCYGDATCYZAGZUSARAGIWWAYDDCYGAZLISGZAGLAPSTNCBBANGYHISOAWAPZGYTCYVDAWAPZLISGZAGLAPSZCBANDCBINZAHAWCOFCWVNAUSCBAYPAZCYGRAOANZCYPHALISGCLIYNAPZAPHSCAZCDINGRCISLNYGDCBINZAZISZAMNCPHACDAGZPVNAGAZNYAPHABDSGGONSZCPZBNITIPHWAPZOAGZPVNAGRAWAZYPGDIPMZAWBGBDAYPHCZIPPAWAPZHAONCYPZAHAHISZANLCPZHAGNLAGUSCCSOSPWINZADPCCRCWCYGIGNLANWCYGDAGYDAPOAPATSZBCGZNISVDAZDCYWWIVYDYZPAHIPPCCSOSPGYMPAAZDAGASDWIZBNITNTSZSPPIWOFSOFIZCDPINACCOCZCYZWIYUSYDAOFSOFIZCYGAZSPOFIGIPZISNWSNWSNCOAWIZCDPINACCBSNAWAPZOADCAZNYAPHABDSGNAPZNCPZHCPGWCOFCWVNAAZGAPZCPZAPWIYZISZAWIPWAYPOAPHYARCAPZAPHYGVYAPZZSPOISBSPBASBDSGTINZUSADABNAWYANCGNAWAPZCHYGRACGNAWAPZYDQCUSADUSAOFIGACSXRCDISGYAGHAWCTAPZNALIQIPGHIPOOAUSAOCAGZAZAXBDINIPGOAWQGZNADCYGGIPGWIPOCSNGAOCDWANSPYPGZCPZAZAXBDINIPGOAWQGZNACOCAGZDALAPZAZNYAPHABDSGCRABISGGCYCDINGDALIDAZAZCLAOSPZSWSDZSASXVCZZAWAPZHCCYDAGAPZNCSPWCRAGZSASXOINVACSHYMPAHAGCPOYAPGRISNGYDPATYZBCGDCWIYPHNANLNAPOAYDPAGCCNNZCBCGYDPCFGYZCBCGSPAWYPSZAWCYGCLAODCWYPAHCSPDINHISHCSPADCHQYDGABANOFCCSHAGGSGHADCBINZAHAWCOFCWVNAYDGABANOFCGSNSPVSGZAHABCDDCGRSGZACSHAGGSGHADCBINZAHAWCOFCWVNACYDGABANOFCGCYPGZCDDCAZNYAPHABDSGCDINGOAZIYGACSHCVPABCNDCMNCLYZHAGIPWCYPZYAPAZDCGLNYZHAGCBFQGYIPIWYAYPHSYGCPZWCZNYGZAYWCMYPCZYIPGISNYNACVYAPUSAZCZZACDSYHYGRACGIYZGCPGFSBBAAZGCPGOYWYANZSPCAGOANZAGBCGSPBIDZNIPDSMSVNAAZCPOYAPOINVACSLIQCMASNBCNZYHAGNYLCMAGHADCPSYZHYGWIYUSADAGZZIPPIWGAYMPASNYCDCSXNYLCMAGHADCPSYZBDSZIPYAPPACDAOINVACSHYZCRCWCYGBDSGCRATSGWANLAYDDUSAOAHYGMNCOYASXLIDCZYDAAPZAPHZGYTCOYDAWAPZDCBCNIDAVYAPUSAGCNBIPGAPCAZBCGSPVYAPMNCPHGAPGAZPAWATZBCGHCSPMNCPHGAOISNGOCNPISGHALIPGOIPLAPYNUSARCWCYGYDPATSZHIPPSPFIWWALYLCPZHALIYNSPIYGACSCSHAGGSGHADCBINZAHAGCOFCWVNASPIYGACSISSPAVZAGSNSPVSGZAGOSDBZCSHAGGSGHADCBINZAHAGCOFCWVNAGAPIWWCPZHCSPPIWZADUSARCWCYGBDSGWCYGDAOINVACSBANOFGIDYZCYNAWAPZGSNDAVSGZABDCOYHAPABNITNCUSAOAWIZSPYUSAOIWWAGYHCPGOAWIZSPYUSAYDNBCPHCYZZISZAGIPWAYDPABNIPIPCNYAPHABDSGYDPANAWSCBCGSPABDSWACRSGUSCOAUSARAWABNYGGAWSNWSNANTCYVDAWAPZCHCCSZNAGCWYGGAGIPZHRAPLIDGDIYPHAWIYLANGDAWCZYPDSYCSGGYYDWAUSYZZANCOIWWAWAGCPOYAPPAGAGBNCPOAGHRAPLIDAGCDCIYGACSHYZCDINGCRCWCYGBDSGCZNAGGCYDDCPZCSVNSYZHAOAZZANBIPGARAZACLAOZCPZHCBNIBIGCGCPGHISZACHYGRACOAUSCYDBNIPIPOAAGZZISZGIPVCMCMAHAGCLIYNUSCYDCBNYGOFAJUSADUSAWCZNAYPTINZSPUSADAWCDFASNYWBYZIQCVDACBISNGSYLYCNHAWWAPZGCPGNBYZRSGUSCOAUSAGAGOFCPGIPGPCASGGAPZBDSGUSCSPGASDNATNCYPRSGUSCOAUSADAHABNITSPHYGHAGIPAGBNCPOAAZBNYGOAWDCPOIDYUSANATNCYPRCWCYGRCWCYGBDSGWCYGDAOINVACSYPHSYGCPZAPOINAZISZAWCZNYGZAWAGISNYNARANISDCYZISZHAGSYZASPGYMAOISGGYPGAPTCOAHADCIYGACSAZHSVSGZAAZHADCBINZACDINGWCAPTIPCPZHCPGDALADISNGRAWCCBBDYUSCYAPOFCPANDAGYHAGCSXYHAGOFANOFCPZOAUSAOAZCSMSNCDIYGACSHAGCPOYAPGRISNGOAUSAOAZNYGZAHYGMNCOYASXGYPYGZNAWCYMNAAZCSMSNCDIYGACSHAGCPOYAPGRISNGLISDCYZTCYNAAPZAPHNAAPONICGGCPZGIPRCWCYGBDSGRAWAZAPCYGCYPGYNLCPZOIPRAOZSNCPZWCYGPCCHNAGGCPZBDSGSPAGQDDCVADCIYGACSHIPZDAGQASXCNHAPZGWAVNDCYAPZWCYPZAPCPZRSGUSCCSTIPHHSOCSNRAOFANOFCYGHALYPANOADCAZBDSGAPOINAWCZZANABIGCPZDCCYGAGSNDALADISNGHSOISGGYPUSAOCNAGGCYZDCDSWYNAHADCDCWBAOALADISNGLYIDAZOCNAGGBCNDCDSWYNAHADCDCWBAUSAGCZZAADDAPABNAGGANCBDSGCCFRCWCYGBDSGCDINGYDWAGAWVDCUSADCCYNGCBCYGGYGGCYZBCNTSWBCNSPAPOAPGIYNYPLYGYVDAUSAVCDCPCYAPZHAGGNCBFYPGHIPZDAGBCGTNDCYAPZDAZCBYGHADCOFCWVNACYPTINZSPCWCONYCYRACZIPHYASZCCHIPPBCNGAGCPMAGYDZCCAPLIQHSNBYZHSNBYZAZHSPBAPZFGHCPGZAGNAGGISLAPYNGHADPINAVIYGIFVIYGOAVIPPBAPZFGAZISVDYAOAZZADPINABANHSACDAOINVACSHYZCRCWCYGBDSGCCBNIBFZACHYGRACZNAHAWCDFASNIYGACSISHWIPWCYGZISRISNGBNIBFZAUSAZSGIYGSPAPLIQHSZAPZCZASNISUSADCZAWBZAZCCYZGYWBDAWAPZOFISPCSTNCMWCYGAPOINAYPZNBYHAGSNOAZZAZANNAHGANZAAPGINOADAHCPGOADIMYGBCNDCFINNASNFCPZCHYGWIYGYPONAWAPZRAZCAPGSBBDYAAXYGZAZYDAXYGZAZYDYOYSPVCSWAHARSHAHYGHYGRAZCAPGSBBDYACDAOINVACSHYZCRCWCYGBDSGCCBNIBFZACHYGRACZNAHAWCDFASNIYGACSISHWIPZISRISNGBNIBFZABCNOAOYADZAPHSGSNPIGZZAGBCNOAHYASUSAZISGHASXPISGCHINIPGHYGOAZZAWAOFCNMAHAHISDASNGYHCPGDABCNCHYGDIYPZCYPADDABISNNCAWVNCGGANSPATYDDAGCYPZAUSADAGCPMAGPIWWAPZDPINAAWVNCGGANSPABNOYASGAAZNCQIPPCPZATYDDAUSADAGCPMAGPIWWAPZDPINACDAOINVACSHYZCRCWCYGBDSGCCUSAOAZZABCNIDAGIYZDAGYMPCDHAPIZNAGBCNCZYIPIYGACSISHWIPCFSNDCYRAAPWANAHNAGGCPZCNAPZNAHCPGDCZAWBZANAZISNPACSNYLCMAHADCPSYZBDSZIPYAPPAPADCYGGABCGYOYSPAGASDABDSWAPIYNAOIWWAGISLAPYNHSWAPGIPMAUSAZIPWACBNITNDCYGGAWCGIDYZSHAYPLYIDAUSYZZAOAVSGZACSHAGGSGHAWCBINZACNNCOFAZIPVAOHAWIPOCSNAZBNOYBYZAZIPGBAOZNADIYPHAWCBINZACDAOINVACSHYZCRCWCYGBDSGCAZDAOINVACSYWWSCVDAAGZZISRISNGYPGZCDDZISRISNGYPGZCDDGSNDAVSGZABDAHABCDDCGRSGZACSHAGGSGHADCBINZAHAWCOFCWVNAAZGAGQASXIPZZISZADCGAWVDCPOAHAGQASXHCSPHWIPUSYNLAAZDCDSWYNAHADCDCWBAAPNSYGGADCPZGSNDSYBNIRAZZAGIPIWVNAGSNDABDCPOFANAZWIPWAFINGHSOANODAHAOAZZAIWVNAUSYMZTDIZZCPZAGSNDABDCPOFANPABISNNCBDSGGCDALANCRCWCYGBDSG\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n",
" Menu de navigation
\n",
" \n",
"
On peut optimiser l'attaque en brute force.\n", "
clefa
ne peut pas être paire. En effet, le modulo de base finissant, dans le cadre de ce TP, par un $6$ il ne sera jamais premier avec un nombre paire. En conséquence, au lieu de faire une boucle avec un incrément clefa+=1
il peut être plus astucieux de faire clefa+=2
en prenant garde de l'initialiser à $1$.Daffine
fait appel à l'algorithme d'euclide étendu. Si, pour une clef $(a, b)$, on note $C_{(a, b)}$ la fonction de chiffrement affine et $D_{(a, b)}$ la fonction de déchiffrement alors :\n",
" $$D_{(a, b)}(x)\\equiv a^{-1}(x-b)\\equiv a^{-1}x-a^{-1}b\\equiv C_{(a^{-1}, -a^{-1}b)}(x)$$\n",
" De plus l'application $inv:\\mathbb{Z}/n\\mathbb{Z}\\longrightarrow\\mathbb{Z}/n\\mathbb{Z}$, $a\\longmapsto a^{-1}$ est une bijection. De sorte que l'on peut faire des boucles, en réécrivant Daffine
sans faire appel au calcul de l'inverse modulaire pour toutes les clefs.\n",
"